package com.smart.expand.proxy;


import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * @author jiangjun
 */
public interface AnnotationProcessor<A extends Annotation> {

    /**
     * 若注解在类上填充做的操作
     *
     * @param annotation : 当前注解
     * @param bean       : 注解的对象
     */
    public void onClass(Class<A> annotation, Object bean);

    /**
     * 若注解在字段上字段填充做的操作
     *
     * @param annotation : 当前注解
     * @param bean       : 注解的对象
     * @param field      : 注解的字段
     * @param value      : 字段的原始值
     * @return : 需要赋值字段的新值
     */
    public Object onField(Class<A> annotation, Object bean, Field field, Object value);

    /**
     * 若注解在方法上方法前做的操作
     *
     * @param annotation : 当前注解
     * @param bean       : 注解的对象
     * @param method     : 注解的方法
     * @param parameters : 进入方法前参数值
     * @return : 进入方法需要传入的新参数列表
     */
    public Object[] methodBefore(Class<A> annotation, Object bean, Method method, Object[] parameters);

    /**
     * 若注解在方法上方法后做的操作
     *
     * @param annotation : 当前注解
     * @param bean       : 注解的对象
     * @param method     : 注解的方法
     * @param ret        : 原方法返回值
     * @return : 需要的返回值
     */
    public Object methodAfter(Class<A> annotation, Object bean, Method method, Object ret);

    /**
     * 若注解在方法上方法前做的操作
     *
     * @param annotation : 当前注解
     * @param bean       : 注解的对象
     * @param method     : 注解的方法
     * @param parameters : 进入方法前参数值
     * @return : 进入方法需要传入的新参数列表
     */
    public Object onMethod(Class<A> annotation, Object bean, Method method, Object[] parameters);

    /**
     * 若注解在参数上做的操作
     *
     * @param annotation : 当前注解
     * @param bean       : 注解的对象
     * @param method     : 注解的方法
     * @param parameter  : 注解的参数
     * @param value      : 参数的原始值
     * @return : 需要赋值的新参数值
     */
    public Object onParameter(Class<A> annotation, Object bean, Method method, Parameter parameter, Object value);
}
